/**
 * Axios 拦截器配置
 * 统一的请求和响应拦截处理
 */
import { ElMessage, ElMessageBox } from "element-plus";

/**
 * 请求拦截器工厂函数
 * @param {Object} options - 配置选项
 * @returns {Function} 请求拦截器函数
 */
export const requestInterceptor = (options = {}) => {
  return (config) => {
    // 添加 token
    const token = sessionStorage.getItem("token");
    if (token) {
      config.headers.token = token;
    }

    // 可以根据需求添加其他请求头
    if (options.customHeaders) {
      Object.assign(config.headers, options.customHeaders);
    }

    return config;
  };
};

/**
 * 响应拦截器工厂函数
 * @param {Object} options - 配置选项
 * @returns {Object} 响应拦截器对象
 */
export const responseInterceptor = (options = {}) => {
  return {
    // 成功响应拦截
    success: (response) => {
      // 处理 token 更新
      if (response.headers?.token) {
        sessionStorage.setItem("token", response.headers.token);
      }

      // 返回数据
      return response.data;
    },

    // 错误响应拦截
    error: (error) => {
      // 关闭 loading
      if (options.closeLoading) {
        options.closeLoading();
      }

      // 处理 HTTP 错误状态码
      if (error.response) {
        const { status, data } = error.response;

        switch (status) {
          case 400:
            ElMessage.error(data?.message || "请求参数错误");
            break;

          case 401:
            ElMessage.warning("登录已过期，请重新登录");
            sessionStorage.removeItem("token");
            // 延迟跳转，避免消息提示被关闭
            setTimeout(() => {
              // 使用 window.location 避免循环依赖
              window.location.href = "/login";
            }, 1500);
            break;

          case 403:
            ElMessage.error(data?.message || "没有权限访问该资源");
            break;

          case 404:
            ElMessage.error(data?.message || "请求的资源不存在");
            break;

          case 405:
            ElMessage.error(data?.message || "请求方法不允许");
            break;

          case 408:
            ElMessage.error("请求超时，请稍后重试");
            break;

          case 409:
            ElMessage.error(data?.message || "数据冲突，请刷新后重试");
            break;

          case 413:
            ElMessage.error("上传文件过大");
            break;

          case 414:
            ElMessage.error("请求 URL 过长");
            break;

          case 415:
            ElMessage.error("不支持的媒体类型");
            break;

          case 422:
            ElMessage.error(data?.message || "请求参数验证失败");
            break;

          case 429:
            ElMessage.warning("请求过于频繁，请稍后再试");
            break;

          case 500:
            ElMessage.error("服务器内部错误，请联系管理员");
            break;

          case 501:
            ElMessage.error("服务器不支持该功能");
            break;

          case 502:
            ElMessage.error("网关错误，请稍后重试");
            break;

          case 503:
            ElMessage.error("服务暂时不可用，请稍后重试");
            break;

          case 504:
            ElMessage.error("网关超时，请稍后重试");
            break;

          default:
            // 如果有自定义消息则显示，否则显示默认错误
            const errorMsg =
              data?.message || error.message || `请求失败 (${status})`;
            ElMessage.error(errorMsg);
            break;
        }
      } else if (error.request) {
        // 请求已发出但没有收到响应
        if (error.code === "ECONNABORTED") {
          ElMessage.error("请求超时，请检查网络连接");
        } else if (error.message?.includes("Network Error")) {
          ElMessage.error("网络连接失败，请检查网络设置");
        } else {
          ElMessage.error("无法连接到服务器，请稍后重试");
        }
      } else {
        // 其他错误
        ElMessage.error(error.message || "请求配置错误");
      }

      // 返回拒绝的 Promise，让调用者可以处理
      return Promise.reject(error);
    },
  };
};




/**
 * 请求错误拦截器
 * @param {Function} closeLoading - 关闭 loading 的函数
 * @returns {Function}
 */
export const requestErrorInterceptor = (closeLoading) => {
  return (error) => {
    if (closeLoading) {
      closeLoading();
    }
    return Promise.reject(error);
  };
};
